home *** CD-ROM | disk | FTP | other *** search
- #
- # This file is part of OpenVIP (http://openvip.sourceforge.net)
- #
- # Copyright (C) 2002-2003
- # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
- #
- # This program is licensed under GNU General Public License version 2;
- # see file COPYING in the top level directory for details.
- #
- # $Id: SettingsDialog.py,v 1.18 2003/06/18 16:55:08 vaclavslavik Exp $
- #
-
- from wxPython.wx import *
- import globals, logging, render
-
- ID_SAVE = wxNewId()
- ID_LOAD = wxNewId()
- ID_SLIDER = wxNewId()
- ID_PREVIEW = wxNewId()
- ID_AUTOPREVIEW = wxNewId()
-
- PREVIEW_SIZE = (240, 180)
-
- # begin wxGlade: dependencies
- # end wxGlade
-
- class SettingsDialog(wxDialog):
- """Base class for filters and transitions settings dialogs."""
-
- def __init__(self, *args, **kwds):
- self.plugin_panel = None
- self.hasPreview = True
- self.makingPreview = False
- self.needsPreview = False
- self.needsPreviewPosChange = False
- # begin wxGlade: SettingsDialog.__init__
- kwds["style"] = wxCAPTION|wxRESIZE_BORDER|wxTHICK_FRAME
- wxDialog.__init__(self, *args, **kwds)
- self.panel = wxPanel(self, -1)
- self.load = wxButton(self, ID_LOAD, "&Load...")
- self.save = wxButton(self, ID_SAVE, "&Save...")
- self.preview = wxStaticBitmap(self, -1, wxNullBitmap)
- self.slider = wxSlider(self, ID_SLIDER, 0, 0, 10, style=wxSL_HORIZONTAL|wxSL_AUTOTICKS)
- self.autopreview = wxCheckBox(self, ID_AUTOPREVIEW, "&Automatic preview")
- self.btn_preview = wxButton(self, ID_PREVIEW, "&Preview")
- self.ok = wxButton(self, wxID_OK, "OK")
- self.cancel = wxButton(self, wxID_CANCEL, "Cancel")
-
- self.__set_properties()
- self.__do_layout()
- # end wxGlade
- EVT_BUTTON(self, ID_PREVIEW, self.OnPreview)
- EVT_CHECKBOX(self, ID_AUTOPREVIEW, self.OnAutoPreviewChange)
- EVT_BUTTON(self, ID_SAVE, self.OnSave)
- EVT_BUTTON(self, ID_LOAD, self.OnLoad)
- EVT_COMMAND_SCROLL(self, ID_SLIDER, self.OnPreviewPosChange)
- render.EVT_RENDERING_DONE(self, self.OnPreviewRendered)
-
- def SetPreview(self, hasPreview):
- """Call SetPreview(True) to show preview of applied filter.
- (Derived class should call this, it doesn't make sense for
- e.g. audio filters.) If set to true then derived class must
- implement GeneratePreview(self,params) and
- ChangePreviewPosition(self,pos) methods."""
- self.hasPreview = hasPreview
- self.autopreview.Show(hasPreview)
- self.btn_preview.Show(hasPreview)
- self.preview.Show(hasPreview)
- self.slider.Show(hasPreview)
- self.__do_layout()
-
- def __set_properties(self):
- # begin wxGlade: SettingsDialog.__set_properties
- self.SetTitle("Settings")
- self.autopreview.SetValue(1)
- self.ok.SetDefault()
- # end wxGlade
- self.SetTitle(self.GetTitle())
- self.preview.SetSize(PREVIEW_SIZE)
- self.autopreview.SetValue(
- wxConfigBase_Get().ReadInt('/SettingsDialog/autopreview', 0))
- self.OnAutoPreviewChange(None)
-
- def __do_layout(self):
- # begin wxGlade: SettingsDialog.__do_layout
- sizer_1 = wxBoxSizer(wxHORIZONTAL)
- sizer_2 = wxBoxSizer(wxVERTICAL)
- sizer_3 = wxBoxSizer(wxHORIZONTAL)
- sizer_4 = wxBoxSizer(wxHORIZONTAL)
- sizer_5 = wxBoxSizer(wxVERTICAL)
- sizer_6 = wxBoxSizer(wxHORIZONTAL)
- sizer_5.Add(self.panel, 1, wxALL|wxEXPAND, 5)
- sizer_6.Add(self.load, 0, 0, 0)
- sizer_6.Add(self.save, 0, wxLEFT, 5)
- sizer_5.Add(sizer_6, 0, wxALL|wxEXPAND, 5)
- sizer_1.Add(sizer_5, 1, wxEXPAND, 0)
- sizer_2.Add(self.preview, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5)
- sizer_2.Add(self.slider, 0, wxEXPAND, 0)
- sizer_4.Add(self.autopreview, 1, 0, 0)
- sizer_4.Add(self.btn_preview, 0, 0, 0)
- sizer_2.Add(sizer_4, 0, wxTOP|wxBOTTOM|wxEXPAND, 5)
- sizer_2.Add(20, 20, 1, 0, 0)
- sizer_3.Add(self.ok, 0, wxRIGHT, 5)
- sizer_3.Add(self.cancel, 0, 0, 0)
- sizer_2.Add(sizer_3, 0, wxTOP|wxALIGN_RIGHT, 5)
- sizer_1.Add(sizer_2, 0, wxALL|wxEXPAND, 5)
- self.SetAutoLayout(1)
- self.SetSizer(sizer_1)
- sizer_1.Fit(self)
- sizer_1.SetSizeHints(self)
- self.Layout()
- # end wxGlade
-
- def LoadContent(self, plugin):
- """Loads settings dialog for plugin 'plugin'."""
- classname=None
- try:
- try:
- exec 'import settings_dlgs.%s%s' % (plugin, self.GetClass())
- classname=plugin+self.GetClass()
- except ImportError:
- exec 'import settings_dlgs.%s' % plugin
- classname=plugin
- except ImportError:
- wxLogError("No settings available for '%s'." % plugin)
- return False
- try:
- panel = eval('settings_dlgs.%s.getPanel(self,self.panel)' % classname)
- except NameError:
- wxLogError("No settings available for '%s'." % plugin)
- return False
- psizer = wxBoxSizer(wxHORIZONTAL)
- psizer.Add(panel, 1, wxEXPAND)
- self.panel.SetAutoLayout(1)
- self.panel.SetSizer(psizer)
- psizer.Fit(self.panel)
- psizer.SetSizeHints(self.panel)
- self.panel.Layout()
- self.__do_layout()
- self.SetTitle('%s: %s' % (self.GetTitle(), plugin))
- self.plugin = plugin
- self.plugin_panel = panel
- panel.SetParams({})
- return True
-
- def SetParams(self, p):
- """Called to set parameters. p is dictionary with strings."""
- self.plugin_panel.SetParams(p)
- self.UpdatePreview(force=True)
-
- def GetParams(self):
- """Returns current parameters."""
- return self.plugin_panel.GetParams()
-
- def OnAutoPreviewChange(self, event):
- self.btn_preview.Enable(not self.autopreview.GetValue())
- wxConfigBase_Get().WriteInt('/SettingsDialog/autopreview',
- self.autopreview.GetValue())
- if self.autopreview.GetValue():
- self.UpdatePreview()
-
- def OnPreview(self, event):
- self.UpdatePreview(force=True)
-
- def UpdatePreview(self, force=False):
- """Updates the preview. Called when some parameter changes."""
- if self.plugin_panel == None: return
- if force or self.autopreview.GetValue():
- if self.makingPreview:
- self.needsPreview = True
- return
- self.needsPreview = False
- self.makingPreview = True
- p = self.GetParams()
- self.btn_preview.Enable(False)
- self.GeneratePreview(p)
-
- def OnPreviewPosChange(self, event):
- if self.makingPreview:
- self.needsPreviewPosChange = True
- return
- self.needsPreviewPosChange = False
- self.makingPreview = True
- self.ChangePreviewPosition(self.slider.GetValue())
-
- def OnPreviewRendered(self, event):
- if event.data != None:
- img = wxEmptyImage(PREVIEW_SIZE[0], PREVIEW_SIZE[1])
- img.SetData(event.data)
- bmp = wxBitmapFromImage(img)
- self.preview.SetBitmap(bmp)
- self.btn_preview.Enable(not self.autopreview.GetValue())
- self.makingPreview = False
- if self.needsPreviewPosChange:
- self.OnPreviewPosChange(None)
- if self.needsPreview:
- self.UpdatePreview(force=True)
-
- def WaitUntilNotUsed(self):
- if self.makingPreview:
- self.needsPreviewPosChange = False
- self.needsPreview = False
- busy = wxBusyCursor()
- while self.makingPreview:
- wxYield()
-
- def OnSave(self, event):
- ret = wxFileSelector('Save plugin settings',
- wildcard='OpenVIP plugin settings (*.xml)|*.xml',
- flags=wxSAVE|wxOVERWRITE_PROMPT)
- if ret == '': return
- file = '<?xml version="1.0" ?>\n'
- file += '<settings class="%s" name="%s">\n' % (self.GetClass(),
- self.plugin)
- par = self.plugin_panel.GetParams()
- for p in par:
- file += ' <param name="%s">%s</param>\n' % (p, par[p])
- file += '</settings>\n'
- f = open(ret, 'wt')
- f.write(file)
- f.close()
-
- def OnLoad(self, event):
- file = wxFileSelector('Load plugin settings',
- wildcard='OpenVIP plugin settings (*.xml)|*.xml',
- flags=wxOPEN|wxFILE_MUST_EXIST)
- if file == '': return
- import xml.dom.minidom
- doc = xml.dom.minidom.parse(file)
- if doc.documentElement.nodeName != 'settings':
- wxLogError('Not OpenVIP XML settings file')
- return
- if doc.documentElement.getAttribute('class') != self.GetClass() or \
- doc.documentElement.getAttribute('name') != self.plugin:
- wxLogError("File '%s' does not contain settings for '%s'" % (file, self.plugin))
- return
- params = {}
- for node in doc.getElementsByTagName('param'):
- params[node.getAttribute('name')] = node.firstChild.data
- self.plugin_panel.SetParams(params)
-
-
- # -----------------------------------------------------------------
- # Override these methods to get working xxxSettingsClass:
- # -----------------------------------------------------------------
-
- def GetClass(self):
- """Derived class must override this to provide class suffix
- (e.g. VFilter, AFilter)"""
- pass
-
- def GetTitle(self):
- """Returns dialog's title"""
- return 'Settings'
-
- def GeneratePreview(self, params):
- """Called to generate preview. See SetPreview."""
- pass
-
- # end of class SettingsDialog
-
-